到這一步建議先連線 table plus 進行觀察, table plus 是超好用資料庫圖形化工具,他的免費試限制是兩個視窗,第三個視窗會跳出付費解鎖,到時再關掉一個視窗即可開啟別的,也就是不介意麻煩一點的話是可以一直免費用下去的!
官方網站及下載:https://tableplus.com
安裝完開啟後,可以按右鍵
> New
> Connection
我的mac 是使用 mariadb,所以我這邊選擇 mariadb,然後 create
然後輸入資料庫名稱、使用者帳號及密碼,按下 Test
都顯示綠色的就可以點選 Connect
連線囉!
終於到了 migration 的重頭戲!
當第一次 migrate 時,會執行所有 migration 檔案,假設三個 migration 是分別建立三張 table
php artisan migrate:rollback
,會回復最新一梯次的migration執行。(這裡舉例結果會是 drop 三張 table,僅留下空白的 migrations table)php artisan migrate:rollback —step=1
都是取消一個 migration 檔案的執行。php artisan migrate:rollback —step=2
就會取消二個 migration 檔案的執行。仔細看 Table Plus,執行 php artisan migrate
後,多了一張 migrations
table
migrations
table 有一個 batch
欄位:
batch
就是 migration 文件的"批次"編號,預設起始值是 1。php artisan migrate
時,Laravel 會按照 batch
編號的順序執行 migrate。php artisan migrate:rollback
時,Laravel 會 rollback 最後一個批次(batch)的 migration 檔案。當資料庫已有三張 table ,此時新增第四個 migrations 檔案,並執行 php artisan migrate 後, Table 4 會被建立,batch 值為 2,因為 Table 4 是第二梯次被執行 migrate 的檔案。
下面可以再比較一下 artisan 指令與 batch 的欄位值:
php artisan migrate, 建立三個 table, batch 值皆為 1
php artisan migrate:rollback —step=3 ,然後這三個 table 都被 rollback ,因此 migrations 無資料
php artisan migrate,第二次 migrate 重新建立三個 table,batch 值為 1 (因為沒有更小的梯次了)
php artisan migrate:rollback —step=2 ,然後又 rollback 兩個檔案,只剩 Table 1
**php artisan migrate,**再次 migrate,Table 2、Table 3 的 batch 值皆為 2
php artisan migrate:rollback,再次 rollback ,最新的梯次 ( batch = 2 ),被回復,migration 又只剩下 Table 1
每一次執行新的 migration 檔案時,都一定要 rollback 看看,沒有報錯再 migrate 回來唷!
因為 rollback 的同時,就是執行 migration 檔案內的 down() 動作,菜鳥很常 down() 動作沒寫、或是寫錯,一開始沒有發現,等到新增超多張表之後要再來 debug 就已經為時已晚啦!所以一定要在 migrate 時一併 rollback 看看檢查一下唷!
忘記執行 php artisan migrate 對資料表真正動手修改
protected $fillable 忘記一起修改
我自己經常耍笨遇到這個問題,通常情況會是欄位結構不是 nullable() ,必須要給他值,
然後 model 檔案裡面 protected $fillable = []; 忘記加入這個新增的欄位
migration 檔案分成 up()
、down()
兩個區塊,up()和down()務必要相對應,才不會造成後面許多報錯機會。例如
up():新增 users table|新增 A 欄位|修改 B 欄位為 nullable
down():刪除 users table|刪除 A 欄位|取消 B欄位為 nullable
感覺以後會用到XD
週期性的刪除資料
class Flight extends Model
{
use Prunable;
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonth());
}
}